'''数字三角形
题目描述
    7
  3   8
 8  1   0
2 7   4  4
4 5 2  6  5
上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径，把路径上面的数加起来可以得到一个和，你的任务就是找到最大的和。
路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右边的那个数。此外，向左下走的次数与向右下走的次数相差不能超过1。
输入描述
输入的第一行包含—个整数N (1≤N≤100)，表示三角形的行数。
下面的N行给出数字三角形。数字三角形上的数都是О至100之间的整数。
输出描述
输出—个整数，表示答案。
输入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出
27'''
import os
import sys

# 算法中哪里体现了“向左下走的次数与向右下走的次数相差不能超过1”这个限定？？？？
# 为什么最终结果是在dp最后一行的居中的数据中选择？？？？

# 请在此输入您的代码
n = int(input())
arr = [list(map(int,input().split())) for i in range(n)]    #输入的数据
dp = [[0]*(i+1) for i in range(n)]                          #dp数组记录
dp[0][0] = arr[0][0]

for i in range(1,n):            #从第二行开始遍历
    for j in range(i+1):
        if j == 0:              #当为第0列时，只能继承上一行的第0列
            dp[i][j] = dp[i-1][j] + arr[i][j]
        elif j == i:            #当为第i行第i列时，只能继承上一行的第i-1列
            dp[i][j] = dp[i-1][j-1] + arr[i][j]
        else:
            dp[i][j] = max(dp[i-1][j-1],dp[i-1][j]) + arr[i][j]

number = 0
if n%2 == 0:            #如果是偶数行，则在最后一行中间两个里面取
    number = max(dp[n-1][(n-1)//2],dp[n-1][(n-1)//2 +1])
if n%2 == 1:            #如果是奇数行，则在最后一行中间取
    number = dp[n-1][(n-1)//2]
print(number)